package com.dyb.demo;

class TestFinalize {
    // 一个对象的finalize()最多只会被系统调用一次
    // 不推荐使用；finalize() 在垃圾回收之前被调用，一般用在做清理那些非new出来对象占用内存的工作，例如在本地方法中调用c/c++产生的内存
    // 另一种用法：作为验证对象的‘终结条件’，在销毁对象前检查对象是否被正确的关闭
    // 运行代价高，不确定性大，无法保证各个对象的调用顺序。

    public static void main(String[] args) {
        Book novel = new Book(true);
        novel.checkedIn();
        new Book(true);
        System.gc();
    }

}

class Book {
    boolean checkedOut;
    Book(boolean checkedOut) {
        this.checkedOut = checkedOut;
    }

    void checkedIn(){
        this.checkedOut = false;
    }

    @Override
    protected void finalize() {
        if(checkedOut) {
            System.out.println("Error: CheckedO out");
        }
    }
}